Utforska frontend-statuskanaler för blockkedjeskalbarhet. LÀr dig hur de möjliggör snabba, billiga off-chain-transaktioner, vilket förbÀttrar dApp-prestanda och anvÀndarupplevelse.
Frontend blockkedjestatuskanaler: Off-chain-transaktionshantering för skalbara dApps
Blockkedjetekniken, Àven om den Àr revolutionerande, stÄr inför betydande skalbarhetsutmaningar. Att bearbeta varje transaktion on-chain kan leda till höga transaktionsavgifter (gasavgifter), lÄngsamma bekrÀftelsetider och nÀtverksstockning. Detta pÄverkar anvÀndarupplevelsen (UX) för decentraliserade applikationer (dApps) negativt och hindrar en bredare adoption. En lovande lösning pÄ dessa utmaningar Àr anvÀndningen av statuskanaler. Denna artikel fördjupar sig i frontend-blockkedjestatuskanaler och utforskar deras funktionalitet, fördelar, utmaningar och praktiska tillÀmpningar. Vi kommer att fokusera pÄ hur dessa kanaler möjliggör off-chain-transaktionshantering för att skapa snabbare, billigare och mer skalbara dApps.
Vad Àr statuskanaler?
I grunden Àr statuskanaler en Layer 2-skalningslösning som gör det möjligt för deltagare att genomföra flera transaktioner utanför huvudblockkedjan. TÀnk pÄ det som att öppna en direkt, privat kommunikationslinje mellan tvÄ eller flera parter som vill göra frekventa transaktioner. Endast öppnandet och stÀngningen av kanalen krÀver on-chain-transaktioner, vilket avsevÀrt minskar belastningen pÄ huvudblockkedjan.
HÀr Àr en förenklad analogi: FörestÀll dig att du och en vÀn spelar ett spel med insatser. IstÀllet för att skriva ner varje enskild insats i en offentlig liggare (blockkedjan), kommer ni överens om att hÄlla reda pÄ poÀng och insatsbelopp mellan er pÄ ett separat papper (statuskanalen). Först nÀr ni Àr klara med spelet registrerar ni det slutliga resultatet i den offentliga liggaren.
Hur statuskanaler fungerar
Den allmÀnna processen innefattar följande steg:
- Kanalinitiering: Deltagarna sÀtter in medel i ett smart kontrakt med flera signaturer pÄ huvudblockkedjan. Detta kontrakt fungerar som grunden för statuskanalen.
- Off-chain-transaktioner: Deltagarna utbyter signerade meddelanden som representerar transaktioner inom kanalen. Dessa transaktioner uppdaterar kanalens tillstÄnd (t.ex. saldon, speltillstÄnd). Avgörande Àr att dessa transaktioner *inte* sÀnds till blockkedjan.
- TillstÄndsuppdateringar: Varje off-chain-transaktion representerar ett föreslaget nytt tillstÄnd. Deltagarna signerar dessa tillstÄndsuppdateringar digitalt, vilket ger ett kryptografiskt bevis pÄ överenskommelse. Det senaste, överenskomna tillstÄndet anses vara kanalens giltiga tillstÄnd.
- KanalstÀngning: NÀr deltagarna Àr klara med sina transaktioner skickar en part in det slutliga tillstÄndet (signerat av alla deltagare) till det smarta kontraktet. Det smarta kontraktet verifierar signaturerna och fördelar medlen enligt det slutliga tillstÄndet.
Varför frontend-statuskanaler?
Traditionellt krÀver implementeringar av statuskanaler betydande backend-infrastruktur. Frontend-statuskanaler syftar till att förenkla processen genom att flytta mycket av logiken för kanalhantering till klientsidan (webblÀsare eller mobilapp). Detta erbjuder flera fördelar:
- Minskad serverinfrastruktur: Mindre beroende av centraliserade servrar minskar driftskostnaderna och förbÀttrar decentraliseringen.
- FörbÀttrad anvÀndarupplevelse: Snabbare transaktionshastigheter och lÀgre avgifter skapar en mer responsiv och angenÀm anvÀndarupplevelse.
- FörbÀttrad integritet: Transaktioner sker direkt mellan anvÀndarnas enheter, vilket minimerar exponeringen av transaktionsdata för tredje parter.
- Förenklad utveckling: Frontend-bibliotek och ramverk kan abstrahera bort mycket av komplexiteten som Àr involverad i hanteringen av statuskanaler, vilket gör det lÀttare för utvecklare att integrera statuskanaler i sina dApps.
Nyckelkomponenter i en implementering av frontend-statuskanaler
En typisk implementering av en frontend-statuskanal innefattar följande komponenter:
- Smart kontrakt: Ett smart kontrakt med flera signaturer som Àr driftsatt pÄ blockkedjan. Detta kontrakt hanterar den initiala insÀttningen, uttag av medel och tvistlösning. Det definierar reglerna för statuskanalen och sÀkerstÀller att alla deltagare följer dem.
- Frontend-bibliotek/SDK: Ett JavaScript-bibliotek eller SDK som tillhandahÄller API:er för att hantera statuskanalen frÄn frontend. Detta bibliotek hanterar uppgifter som att generera signaturer, skicka meddelanden och interagera med det smarta kontraktet. Exempel inkluderar bibliotek byggda kring Ethers.js eller Web3.js, men optimerade för statuskanalspecifika operationer.
- Kommunikationslager: En mekanism för deltagare att kommunicera med varandra off-chain. Detta kan vara ett peer-to-peer (P2P)-nÀtverk, en centraliserad meddelandetjÀnst eller en kombination av bÄda. Kommunikationslagret ansvarar för att sÀkert överföra signerade tillstÄndsuppdateringar mellan deltagarna. Exempel inkluderar WebSockets, libp2p eller till och med ett anpassat meddelandeprotokoll.
- TillstÄndshantering: Logik för att hantera kanalens tillstÄnd pÄ klientsidan. Detta inkluderar att spÄra saldon, speltillstÄnd och annan relevant information. Effektiv tillstÄndshantering Àr avgörande för att sÀkerstÀlla datakonsistens och förhindra konflikter.
Fördelar med att anvÀnda frontend-statuskanaler
Frontend-statuskanaler erbjuder en rad fördelar för dApp-utvecklare och anvÀndare:
FörbÀttrad skalbarhet
Genom att bearbeta majoriteten av transaktionerna off-chain minskar statuskanaler avsevÀrt belastningen pÄ huvudblockkedjan, vilket möjliggör högre transaktionsgenomströmning och förbÀttrad skalbarhet. Detta Àr sÀrskilt viktigt för dApps som krÀver frekventa interaktioner, sÄsom onlinespel, mikrobetalningsplattformar och sociala medieapplikationer.
Minskade transaktionsavgifter
Off-chain-transaktioner medför betydligt lĂ€gre avgifter jĂ€mfört med on-chain-transaktioner. Detta gör statuskanaler idealiska för mikrobetalningar och andra anvĂ€ndningsfall dĂ€r höga transaktionsavgifter skulle vara oöverkomliga. FörestĂ€ll dig en streamingtjĂ€nst som lĂ„ter anvĂ€ndare betala per minut de tittar â statuskanaler möjliggör dessa mikrotransaktioner utan bördan av höga gasavgifter.
Snabbare transaktionshastigheter
Off-chain-transaktioner bearbetas nÀstan omedelbart, vilket ger en mycket snabbare anvÀndarupplevelse jÀmfört med att vÀnta pÄ blockbekrÀftelser pÄ huvudblockkedjan. Detta Àr avgörande för applikationer som krÀver interaktioner i realtid, sÄsom onlinespel och handelsplattformar. TÀnk pÄ en decentraliserad börs (DEX) dÀr handlare mÄste reagera snabbt pÄ marknadsfluktuationer; statuskanaler möjliggör nÀstan omedelbar orderutförande.
FörbÀttrad anvÀndarupplevelse
Kombinationen av snabbare transaktionshastigheter och lÀgre avgifter resulterar i en avsevÀrt förbÀttrad anvÀndarupplevelse för dApp-anvÀndare. Detta kan leda till ökat anvÀndarengagemang och adoption av decentraliserade applikationer. Genom att ta bort friktionen som Àr förknippad med on-chain-transaktioner fÄr statuskanaler dApps att kÀnnas mer responsiva och intuitiva.
Ăkad integritet
Ăven om de inte Ă€r privata i sig, kan statuskanaler erbjuda ökad integritet jĂ€mfört med on-chain-transaktioner, eftersom endast kanalens öppnings- och stĂ€ngningstransaktioner registreras pĂ„ den offentliga blockkedjan. Detaljerna om de enskilda transaktionerna inom kanalen förblir privata mellan deltagarna. Detta kan vara fördelaktigt för anvĂ€ndare som vill hĂ„lla sin transaktionshistorik konfidentiell.
Utmaningar med att implementera frontend-statuskanaler
Ăven om frontend-statuskanaler erbjuder mĂ„nga fördelar, finns det ocksĂ„ nĂ„gra utmaningar att beakta:
Komplexitet
Att implementera statuskanaler kan vara komplicerat och krÀver en djup förstÄelse för kryptografi, smarta kontrakt och nÀtverk. Utvecklare mÄste noggrant utforma och implementera kanallogiken för att sÀkerstÀlla sÀkerhet och förhindra sÄrbarheter. De kryptografiska primitiver som Àr involverade, sÄsom digitala signaturer och hashlocks, kan vara svÄra att förstÄ och implementera korrekt.
SĂ€kerhetsrisker
Statuskanaler Àr sÄrbara för olika sÀkerhetsrisker, sÄsom dubbelspenderingattacker, replay-attacker och denial-of-service-attacker. Det Àr avgörande att implementera robusta sÀkerhetsÄtgÀrder för att minska dessa risker. Till exempel mÄste deltagarna noggrant validera alla tillstÄndsuppdateringar och se till att de Àr korrekt signerade. Dessutom Àr en korrekt implementering av tvistlösningsmekanismer i det smarta kontraktet avgörande för att skydda mot illvilliga aktörer.
AnvÀndbarhet
Att göra statuskanaler anvÀndarvÀnliga kan vara utmanande. AnvÀndare mÄste förstÄ de grundlÀggande koncepten för statuskanaler och hur man interagerar med dem. AnvÀndargrÀnssnittet bör vara intuitivt och lÀtt att anvÀnda. PlÄnböcker som MetaMask har inte inbyggt stöd för komplexa statuskanaloperationer, sÄ anpassade UI-komponenter och anvÀndarutbildning krÀvs ofta.
NĂ€tverkslatens
Prestandan hos statuskanaler kan pÄverkas av nÀtverkslatens mellan deltagarna. Hög latens kan leda till förseningar i transaktionsbearbetningen och en försÀmrad anvÀndarupplevelse. Att vÀlja rÀtt kommunikationsprotokoll och infrastruktur Àr avgörande för att minimera latens och sÀkerstÀlla responsivitet.
Beroende av en pÄlitlig kommunikationskanal
Statuskanaler förlitar sig pÄ en pÄlitlig kommunikationskanal mellan deltagarna. Om kommunikationskanalen störs kan transaktioner inte bearbetas. Det Àr dÀrför det Àr viktigt att vÀlja en robust och motstÄndskraftig kommunikationsmekanism, ibland med redundanta vÀgar för meddelandeleverans.
AnvÀndningsfall för frontend-statuskanaler
Frontend-statuskanaler kan anvÀndas i en mÀngd olika applikationer, inklusive:
- Mikrobetalningsplattformar: Möjliggör snabba och billiga mikrobetalningar för innehĂ„llsskapare, onlinetjĂ€nster och andra anvĂ€ndningsfall. FörestĂ€ll dig att dricksa en streamer brĂ„kdelar av en cent per visning â statuskanaler gör detta ekonomiskt genomförbart.
- Onlinespel: UnderlÀttar interaktioner i realtid och transaktioner i spelet i decentraliserade onlinespel. Spelare kan byta föremÄl, lÀgga insatser och delta i turneringar utan att Ädra sig höga transaktionsavgifter.
- Decentraliserade börser (DEX): FörbÀttrar hastigheten och effektiviteten hos decentraliserade börser genom att möjliggöra off-chain-ordermatchning och exekvering. Handlare kan utföra order mycket snabbare och billigare jÀmfört med on-chain-handel.
- Sociala medieplattformar: Möjliggör mikro-dricks, innehÄllsmonetisering och andra sociala interaktioner pÄ decentraliserade sociala medieplattformar. AnvÀndare kan belöna skapare för deras innehÄll utan bördan av höga transaktionsavgifter.
- IoT (Internet of Things)-enheter: Möjliggör maskin-till-maskin-betalningar och datautbyte i IoT-nÀtverk. Enheter kan automatiskt betala för tjÀnster, utbyta data och delta pÄ decentraliserade marknadsplatser. Till exempel kan elfordon automatiskt betala för laddning vid en laddningsstation med hjÀlp av statuskanaler.
Exempel pÄ implementeringar och projekt för statuskanaler
Flera projekt utvecklar och implementerar aktivt statuskanalteknik. HÀr Àr nÄgra anmÀrkningsvÀrda exempel:
- Raiden Network (Ethereum): Ett projekt fokuserat pÄ att bygga ett skalbart betalningskanalnÀtverk för Ethereum. Raiden syftar till att möjliggöra snabba och billiga tokenöverföringar över hela Ethereum-ekosystemet. Det Àr ett av de tidigaste och mest kÀnda statuskanalprojekten.
- Celer Network: En Layer-2-skalningsplattform som stöder statuskanaler och andra skalningstekniker. Celer Network syftar till att tillhandahÄlla en enhetlig plattform för att bygga skalbara dApps. De stöder flera blockkedjor och erbjuder en uppsÀttning verktyg och tjÀnster för utvecklare.
- Connext Network: Ett modulÀrt, icke-förvaringsbaserat interoperabilitetsprotokoll som möjliggör snabba och sÀkra vÀrdeöverföringar mellan olika blockkedjor. De utnyttjar statuskanaler och andra tekniker för att möjliggöra transaktioner över kedjor.
- Counterfactual: Ett ramverk för att bygga statuskanalapplikationer. Counterfactual tillhandahÄller en uppsÀttning verktyg och bibliotek som förenklar utvecklingen av statuskanalapplikationer. De fokuserar pÄ att bygga generisk statuskanalinfrastruktur som kan anvÀndas för ett brett spektrum av anvÀndningsfall.
Teknisk djupdykning: Implementering av en enkel frontend-statuskanal
LÄt oss skissera ett förenklat exempel för att illustrera kÀrnkoncepten för att implementera en frontend-statuskanal. Detta exempel anvÀnder JavaScript, Ethers.js (för att interagera med Ethereum-blockkedjan) och en enkel WebSocket-server för off-chain-kommunikation.
Ansvarsfriskrivning: Detta Àr ett förenklat exempel i illustrativt syfte. En produktionsklar implementering skulle krÀva mer robusta sÀkerhetsÄtgÀrder och felhantering.
1. Smart kontrakt (Solidity)
Detta enkla smarta kontrakt tillÄter tvÄ parter att sÀtta in medel och ta ut dem baserat pÄ ett signerat tillstÄnd.
pragma solidity ^0.8.0;
contract SimpleStateChannel {
address payable public participant1;
address payable public participant2;
uint public depositAmount;
bool public isOpen = false;
mapping(address => uint) public balances;
constructor(address payable _participant1, address payable _participant2, uint _depositAmount) payable {
require(msg.value == _depositAmount * 2, "Initial deposit must be twice the deposit amount");
participant1 = _participant1;
participant2 = _participant2;
depositAmount = _depositAmount;
balances[participant1] = _depositAmount;
balances[participant2] = _depositAmount;
isOpen = true;
}
function closeChannel(uint participant1Balance, uint participant2Balance, bytes memory signature1, bytes memory signature2) public {
require(isOpen, "Channel is not open");
// Hash the state data
bytes32 hash = keccak256(abi.encode(participant1Balance, participant2Balance));
// Verify signatures
address signer1 = recoverSigner(hash, signature1);
address signer2 = recoverSigner(hash, signature2);
require(signer1 == participant1, "Invalid signature from participant 1");
require(signer2 == participant2, "Invalid signature from participant 2");
require(participant1Balance + participant2Balance == depositAmount * 2, "Balances must sum to total deposit");
// Transfer funds
participant1.transfer(participant1Balance);
participant2.transfer(participant2Balance);
isOpen = false;
}
function recoverSigner(bytes32 hash, bytes memory signature) internal pure returns (address) {
bytes32 r;
bytes32 s;
uint8 v;
// EIP-2098 signature
if (signature.length == 64) {
r = bytes32(signature[0:32]);
s = bytes32(signature[32:64]);
v = 27; // Assuming Ethereum mainnet/testnets
// Standard signature recovery
} else if (signature.length == 65) {
r = bytes32(signature[0:32]);
s = bytes32(signature[32:64]);
v = uint8(signature[64]);
} else {
revert("Invalid signature length");
}
return ecrecover(hash, v, r, s);
}
}
2. Frontend (JavaScript med Ethers.js)
// Assume you have initialized ethersProvider and signer
// and have the contract address and ABI
const contractAddress = "YOUR_CONTRACT_ADDRESS";
const contractABI = [...]; // Your contract ABI
const contract = new ethers.Contract(contractAddress, contractABI, signer);
async function openChannel(participant1, participant2, depositAmount) {
const tx = await contract.constructor(participant1, participant2, depositAmount, { value: depositAmount * 2 });
await tx.wait();
console.log("Channel opened!");
}
async function closeChannel(participant1Balance, participant2Balance) {
// Hash the state data
const hash = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(["uint", "uint"], [participant1Balance, participant2Balance]));
// Sign the hash
const signature1 = await signer.signMessage(ethers.utils.arrayify(hash));
const signature2 = await otherSigner.signMessage(ethers.utils.arrayify(hash)); // Assuming you have access to the other signer
// Call the closeChannel function on the smart contract
const tx = await contract.closeChannel(participant1Balance, participant2Balance, signature1, signature2);
await tx.wait();
console.log("Channel closed!");
}
3. Off-chain-kommunikation (WebSocket - förenklat)
Detta Àr en mycket grundlÀggande illustration. I en verklig applikation skulle du behöva ett mer robust och sÀkert kommunikationsprotokoll.
// Client-side (Participant A)
const socket = new WebSocket("ws://localhost:8080");
socket.onopen = () => {
console.log("Connected to WebSocket server");
};
socket.onmessage = (event) => {
const message = JSON.parse(event.data);
if (message.type === "stateUpdate") {
// Verify the state update (signatures, etc.)
// Update local state
console.log("Received state update:", message.data);
}
};
function sendStateUpdate(newState) {
socket.send(JSON.stringify({ type: "stateUpdate", data: newState }));
}
// Simple Server-side (Node.js)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', ws => {
console.log('Client connected');
ws.onmessage = message => {
console.log(`Received message: ${message.data}`);
wss.clients.forEach(client => {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(message.data.toString()); // Broadcast to other clients
}
});
};
ws.on('close', () => {
console.log('Client disconnected');
});
});
console.log('WebSocket server started on port 8080');
Förklaring:
- Smart kontrakt: Kontraktet `SimpleStateChannel` hanterar den initiala insÀttningen, lagrar saldon och verifierar signaturer innan uttag av medel tillÄts. Funktionen `closeChannel` Àr avgörande, eftersom den verifierar att signaturerna som tillhandahÄlls av bÄda parter Àr giltiga för det slutliga tillstÄndet (saldona) innan medlen frigörs.
- Frontend: JavaScript-koden anvÀnder Ethers.js för att interagera med det smarta kontraktet. Den innehÄller funktioner för att öppna och stÀnga kanalen. Funktionen `closeChannel` signerar det slutliga tillstÄndet (saldona) med anvÀndarens privata nyckel och skickar signaturerna till det smarta kontraktet.
- Off-chain-kommunikation: WebSocket-servern tillhandahÄller en enkel kommunikationskanal för deltagare att utbyta tillstÄndsuppdateringar. I ett verkligt scenario skulle du troligen anvÀnda ett mer sofistikerat kommunikationsprotokoll med inbyggda sÀkerhetsfunktioner.
Arbetsflöde:
- Deltagarna driftsÀtter det smarta kontraktet och sÀtter in medel.
- De ansluter till WebSocket-servern.
- De utbyter signerade tillstÄndsuppdateringar (t.ex. saldoÀndringar) via WebSocket-servern.
- NÀr de Àr klara anropar de funktionen `closeChannel` pÄ det smarta kontraktet med de slutliga saldona och signaturerna.
SÀkerhetsaspekter för frontend-statuskanaler
SÀkerhet Àr av yttersta vikt vid implementering av statuskanaler. HÀr Àr nÄgra viktiga sÀkerhetsaspekter:
- Signaturverifiering: Verifiera alltid noggrant signaturerna för tillstÄndsuppdateringar innan du accepterar dem. AnvÀnd ett robust signaturbibliotek och se till att signaturen genereras med rÀtt privat nyckel. Det smarta kontraktet *mÄste* verifiera signaturer innan medel frigörs.
- Nonce-hantering: AnvÀnd nonces (unika identifierare) för att förhindra replay-attacker. Varje tillstÄndsuppdatering bör inkludera en unik nonce som ökas med varje transaktion. Se till att det smarta kontraktet och frontend-logiken upprÀtthÄller korrekt nonce-anvÀndning.
- TillstÄndsvalidering: Validera alla tillstÄndsuppdateringar noggrant för att sÀkerstÀlla att de Àr förenliga med kanalreglerna. Se till exempel till att saldona i en betalningskanal inte överstiger det totala insÀttningsbeloppet.
- Tvistlösning: Implementera en robust tvistlösningsmekanism i det smarta kontraktet. Denna mekanism bör göra det möjligt för deltagare att bestrida ogiltiga tillstÄndsuppdateringar och lösa tvister pÄ ett rÀttvist sÀtt. Det smarta kontraktet bör ha en tidsgrÀns under vilken en utmaning kan vÀckas.
- DoS-skydd: Implementera ÄtgÀrder för att skydda mot denial-of-service (DoS)-attacker. BegrÀnsa till exempel antalet tillstÄndsuppdateringar som kan skickas in inom en given tidsperiod.
- SÀker nyckelhantering: Förvara och hantera de privata nycklarna som anvÀnds för att signera tillstÄndsuppdateringar pÄ ett sÀkert sÀtt. AnvÀnd hÄrdvaruplÄnböcker eller andra sÀkra lösningar för nyckellagring. Förvara aldrig privata nycklar i klartext.
- Revision: LÄt din kod granskas av ett vÀlrenommerat sÀkerhetsföretag för att identifiera och ÄtgÀrda potentiella sÄrbarheter.
Framtiden för frontend-statuskanaler
Frontend-statuskanaler representerar ett betydande steg framÄt för blockkedjeskalbarhet och anvÀndbarhet. I takt med att dApps blir mer komplexa och krÀvande kommer behovet av effektiv off-chain-transaktionshantering bara att öka. Vi kan förvÀnta oss att se ytterligare framsteg inom statuskanaltekniken, inklusive:
- FörbÀttrade verktyg: Mer utvecklarvÀnliga bibliotek och ramverk kommer att göra det lÀttare att bygga och driftsÀtta statuskanalapplikationer.
- Standardisering: Standardiserade protokoll för statuskanalkommunikation och dataformat kommer att förbÀttra interoperabiliteten mellan olika implementeringar.
- Integration med befintliga plÄnböcker: Sömlös integration med populÀra plÄnböcker kommer att göra det lÀttare för anvÀndare att delta i statuskanaler.
- Stöd för mer komplexa tillstÄndsövergÄngar: Statuskanaler kommer att kunna stödja mer komplexa tillstÄndsövergÄngar, vilket möjliggör ett bredare spektrum av applikationer. Till exempel stöd för flerpartskanaler med mer komplex spellogik.
- Hybridmetoder: Kombinera statuskanaler med andra Layer-2-skalningslösningar, sÄsom rollups, för att uppnÄ Ànnu större skalbarhet.
Slutsats
Frontend-blockkedjestatuskanaler erbjuder en kraftfull lösning för att skala dApps och förbĂ€ttra anvĂ€ndarupplevelsen. Genom att möjliggöra snabba, billiga och privata off-chain-transaktioner lĂ„ser statuskanaler upp nya möjligheter för decentraliserade applikationer. Ăven om det finns utmaningar att övervinna Ă€r fördelarna med statuskanaler obestridliga, och de Ă€r pĂ„ vĂ€g att spela en avgörande roll i framtiden för blockkedjetekniken. I takt med att tekniken mognar och fler utvecklare anammar statuskanaler kan vi förvĂ€nta oss att se en ny generation av skalbara och anvĂ€ndarvĂ€nliga dApps som kan nĂ„ en bredare publik.